package main

import (
    "fmt"
    _ "github.com/bylevel/pq"
    _ "github.com/go-sql-driver/mysql"
    "github.com/lunny/xorm"
    _ "github.com/mattn/go-sqlite3"
)

type SyncUser2 struct {
    Id      int64
    Name    string `xorm:"unique"`
    Age     int    `xorm:"index"`
    Title   string
    Address string
    Genre   string
    Area    string
    Date    int
}

type SyncLoginInfo2 struct {
    Id       int64
    IP       string `xorm:"index"`
    UserId   int64
    AddedCol int
    // timestamp should be updated by database, so only allow get from db
    TimeStamp string
    // assume
    Nonuse int    `xorm:"unique"`
    Newa   string `xorm:"index"`
}

func sync(engine *xorm.Engine) error {
    return engine.Sync(&SyncLoginInfo2{}, &SyncUser2{})
}

func sqliteEngine() (*xorm.Engine, error) {
    f := "sync.db"
    //os.Remove(f)

    return xorm.NewEngine("sqlite3", f)
}

func mysqlEngine() (*xorm.Engine, error) {
    return xorm.NewEngine("mysql", "root:@/test?charset=utf8")
}

func postgresEngine() (*xorm.Engine, error) {
    return xorm.NewEngine("postgres", "dbname=xorm_test sslmode=disable")
}

type engineFunc func() (*xorm.Engine, error)

func main() {
    //engines := []engineFunc{sqliteEngine, mysqlEngine, postgresEngine}
    //engines := []engineFunc{sqliteEngine}
    //engines := []engineFunc{mysqlEngine}
    engines := []engineFunc{postgresEngine}
    for _, enginefunc := range engines {
        Orm, err := enginefunc()
        fmt.Println("--------", Orm.DriverName, "----------")
        if err != nil {
            fmt.Println(err)
            return
        }
        Orm.ShowSQL = true
        err = sync(Orm)
        if err != nil {
            fmt.Println(err)
        }

        _, err = Orm.Where("id > 0").Delete(&SyncUser2{})
        if err != nil {
            fmt.Println(err)
        }

        user := &SyncUser2{
            Name:    "testsdf",
            Age:     15,
            Title:   "newsfds",
            Address: "fasfdsafdsaf",
            Genre:   "fsafd",
            Area:    "fafdsafd",
            Date:    1000,
        }
        _, err = Orm.Insert(user)
        if err != nil {
            fmt.Println(err)
        }
    }
}
